阅读更多

23顶
0踩

编程语言

原创新闻 Ruby on Rails 2.2 发行公告

2008-10-25 23:02 by 见习编辑 robbin 评论(6) 有9287人浏览
Ruby on Rails 2.2版本是Rails一次大的版本升级,相当于Rails1.1到Rails1.2的飞跃,或者相当于Rails1.2到Rails2.0这样的版本飞跃,包括了一些意义重大的功能,因此JavaEye将Ruby on Rails 2.2官方的Release Notes简要的翻译和点评。原文在:http://guides.rubyonrails.org/2_2_release_notes.html

1. 基础设施(Infrastructure)

1.1. 国际化(Internationalization)

Rails 2.2提供了一套简单的国际化设施,该设施是由Rails i18n团队开发的,更多信息请看:
Official Rails i18 website
Finally. Ruby on Rails gets internationalized
Localizing Rails : Demo application

1.2. Ruby 1.9和JRuby的兼容性

除了Rails2.2已经是线程安全这个改动之外,Rails也做了其他大量改动,以便于Rails可以更好的运行在即将发布的Ruby 1.9和JRuby上面。

2. 文档指南

Rails源代码里面的注释文档已经很丰富了,除此之外,我们推出了Rails官方文档指南网站:Ruby on Rails Guides,目前文档指南已经包括以下部分:
引用
Getting Started with Rails
Rails Database Migrations
Active Record Associations
Active Record Finders
Layouts and Rendering in Rails
Action View Form Helpers
Rails Routing from the Outside In
Basics of Action Controller
Rails Caching
Testing Rails Applications
Securing Rails Applications
Debugging Rails Applications
Benchmarking and Profiling Rails Applications
The Basics of Creating Rails Plugins


总得来说,文档指南为Rails初学者和中级水平的开发者提供了成千上万的文档。如果你想在本地生成这些文档,只需要执行命令:

rake doc:guides


就可以了。将会在你的Rails应用的RAILS_ROOT/doc/guides目录下面创建全套的文档指南,然后你可以直接用浏览器打开RAILS_ROOT/doc/guides/index.html这个网页,来阅读指南。

3、更加优秀的HTTP集成功能: 唾手可得的ETag功能

Rails提供了对HTTP头信息的etag和last modified的功能,意味着当浏览器再次读取同一个URL的时候,如果服务器页面没有发生改变,那么Rails可以直接返回“304 Not Modified”头信息,而不必返回任何页面。这个功能实际上是基于Rails REST架构上的HTTP缓存支持。下面看个例子:
class ArticlesController < ApplicationController
  def show_with_respond_to_block
    @article = Article.find(params[:id])
    if stale?(:last_modified => @article.published_at.utc, :etag => @article)
      respond_to do |wants|
        # normal response processing
      end
    end
  end

  def show_with_implied_render
    @article = Article.find(params[:id])
    fresh_when(:last_modified => @article.published_at.utc, :etag => @article)
  end
end


当浏览器第一次访问的时候,Rails会用文章发布时间作为HTTP响应的Last Modified,用文章的ID作为etag发送给浏览器,那么当浏览器收到HTTP响应以后,就会记录下来。Rails发送的HTTP响应的头信息类似下面这样的格式:

Last-Modified	Fri, 24 Oct 2008 15:40:25 GMT
Etag	"2502585412"



当浏览器再次访问同一个URL的时候,浏览器就会在HTTP请求的头信息里面携带如下信息发送给服务器:

If-Modified-Since	Fri, 24 Oct 2008 15:40:25 GMT
If-None-Match	"2502585412"


Rails就会收到这些信息,如果文章的ID和文章的发布时间没有被改变的话,那么Rails就不会去渲染模板和发送页面内容,而是直接发送一个HTTP响应的头信息:“304 Not Modified”给浏览器。浏览器收到304响应以后,就会直接读取浏览器本地的缓存页面。

因此这个功能意味着:Rails可以对动态页面实施HTTP协议级别的缓存功能,只要URL代表的资源没有发生状态改变,那么浏览器甚至都不会去服务器端下载页面。这是一种极其高明的缓存策略,不但可以减轻服务器端负载,甚至可以减轻网络带宽。

4. 线程安全(Thread Safety)

Rails2.2已经是线程安全的了。在Web服务器的支持下,你可以以多线程方式运行Rails,这样可以提高性能,节省内存。在服务器生产环境下打开多线程模式,要在config/environments/production.rb文件当中加入如下配置:

config.threadsafe!


更多信息请看:
Thread safety for your Rails
Thread safety project announcement
Q/A: What Thread-safe Rails Means


5. Active Record

ActiveRecord有两大值得一提的新功能:带事务支持的数据库迁移和数据库连接池。此外还有一些小的改进。

5.1. 带事务支持的数据库迁移功能(Transactional Migrations)

以往,数据库迁移的多步操作往往会有问题,如果中间某个步骤出问题,是无法回滚的,而且版本号也被改变了。这意味着你无法简单的通过rake db:migrate:redo命令回滚到出错前的版本。带事务支持的数据库迁移通过在一个DDL事务当中封装迁移步骤解决了这个问题。不过在Rails2.2当中,这个功能仅仅对PostgreSQL数据库生效。在将来,该功能还会提供对其他数据库的支持。

更多信息请看:DDL Transactions

5.2. 数据库连接池(Connection Pooling)

数据库连接池的作用就不用介绍了。Rails默认创建5个数据库连接,不过你也可以在database.yml里面通过pool这个参数来修改。此外还有一个wait_timeout参数,用来设置连接超时。另外你还可以用ActiveRecord::Base.connection_pool调用来直接操作连接池。下面是一个示例:

development:
  adapter: mysql
  username: root
  database: sample_development
  pool: 10
  wait_timeout: 10


更多信息请看:What's New in Edge Rails: Connection Pools


5.3 表连接的Hash参数(Hashes for Join Table Conditions)

可以对表连接的查询条件使用hash参数,这对于复杂的表连接查询来说很有帮助:

class Photo < ActiveRecord::Base
  belongs_to :product
end

class Product < ActiveRecord::Base
  has_many :photos
end

# Get all products with copyright-free photos:
Product.all(:joins => :photos, :conditions => { :photos => { :copyright => false }})


更多信息请看:What's New in Edge Rails: Easy Join Table Conditions

5.4. 新的动态查询方法(New Dynamic Finders)

5.4.1. 查找最后一条符合条件的记录(find_last_by_<attributes>)

# Get the last user who signed up from London
User.find_last_by_city('London')


5.4.2. 查找不符合条件的记录(find_by_<attributes>!)

# Raise ActiveRecord::RecordNotFound exception if 'Moby' hasn't signed up yet!
User.find_by_name!('Moby')


5.5. 禁止对关联对象私有方法的访问

从Rails2.2开始,对于model的关联对象的私有方法,禁止直接调用。这个没什么可说的。


5.6. 其他方面的更改


1、rake db:migrate:redo可以接受一个VERSION指定回滚到哪个版本
2、config.active_record.timestamped_migrations = false可以指定数据库迁移的版本号使用数字,而不是UTC时间戳
3、Counter cache字段不用显式初始化为0
4、ActiveRecord::Base.human_name可以使用i18n进行本地化语言了


6. Action Controller

6.1. 减轻路由的嵌入深度

基于资源的路由如果有深度嵌入的话,那么URL就会很长,如果在URL上面不会引起
歧义的话,那么可以去掉多层嵌套。例如:

map.resources :publishers, :shallow => true do |publisher|
  publisher.resources :magazines do |magazine|
    magazine.resources :photos
  end
end


将产生如下路由:

/publishers/1           ==> publisher_path(1)
/publishers/1/magazines ==> publisher_magazines_path(1)
/magazines/2            ==> magazine_path(2)
/magazines/2/photos     ==> magazines_photos_path(2)
/photos/3               ==> photo_path(3)


magazine资源不必非要写在publisher后面了。

更多信息请看:
Rails Routing from the Outside In
What's New in Edge Rails: Shallow Routes

6.2. 路由可以指定协议集合(Method Arrays for Member or Collection Routes)

map.resources :photos, :collection => { :search => [:get, :post] 

}

search方法可以同时被GET和POST所使用。

6.3. Action Controller其他更改

1、当出现路由无法解析的URL时候,可以自定义错误页面

2、根据HTTP Accept选择render格式的功能默认是关闭的,不过你可以通过配置打开:config.action_controller.user_accept_header = true

3、对于Action的执行时间的统计精确到毫秒数,而不是以前的秒数。

4、Rails现在支持了HTTP-only cookies,可以帮助消除一些跨站点脚本攻击。


7. Action View

1、javascript_include_tag和stylesheet_link_tag现在支持一个:recursive参数,当指定为:all的时候可以自动加载整个目录数下面的文件。
2、Prototype javascript库升级到1.6.0.2版本
3、RJS#page.reload通过JS来刷新浏览器当前地址
4、atom_feed helper提供了:instruct参数,可以让你指定XML处理指令

8. Action Mailer

现在支持了邮件模板的布局功能,例如layouts/customer_mailer.html.erb使用这样的模板来布局,更多信息请看:What's New in Edge Rails: Mailer Layouts

9. Active Support

9.1. Memoization

Memoization可以让那些只需要初始化一次的方法以声明式的方式来编写,例如过去我们这样写:

def full_name
  @full_name ||= "#{first_name} #{last_name}"
end


现在我们可以这样来声明:
extend ActiveSupport::Memoizable

def full_name
  "#{first_name} #{last_name}"
end
memoize :full_name


这样的声明式方法还有:unmemoize, unmemoize_all, 和memoize_all。更多信息请看:
What's New in Edge Rails: Easy Memoization
Memo-what? A Guide to Memoization


9.2. each_with_object


each_with_object 实际上是inject方法的一个替代,例如:
%w(foo bar).each_with_object({}) { |str, hsh| hsh[str] = str.upcase } #=> {'foo' => 'FOO', 'bar' => 'BAR'}


9.3. 前缀代理(Delegates With Prefixes)

通过方法的前缀来指明使用关联类的方法,例如:
class Vendor << ActiveRecord::Base
  has_one :account
  delegate :email, :password, :to => :account, :prefix => true
end


这样就可以直接写vendor.account_email和vendor.account_password了。也可以自定义前缀:
class Vendor << ActiveRecord::Base
  has_one :account
  delegate :email, :password, :to => :account, :prefix => :owner
end

那么你可以用vendor.owner_email和vendor.owner_password这样的方法调用。


后面还有一些非常细小的功能更新,不再一一点评了。
23
0
评论 共 6 条 请登录后发表评论
6 楼 dd_ror 2008-10-28 20:30
看视频可以去rubycnrails.cn
虽然都是简单的
5 楼 yangzhihuan 2008-10-27 10:09
3、更加优秀的HTTP集成功能: 唾手可得的ETag功能
5.4.2. 查找不符合条件的记录(find_by_<attributes>!)

这两个我喜欢.
4 楼 inosin 2008-10-27 09:54
正式版啥时候发布?
3 楼 sina2009 2008-10-26 14:52
非常好,

可惜railsenvy的视频与ruby on rails 2.2 what's new都收费了

看来经济不景气对开源确实有影响

2 楼 blackanger 2008-10-26 01:57
blackanger 写道

太棒了!each_with_object 这个方法,是对所有的对象都支持了 ?inject只支持Hash和Array类型。 还没来得及安装rc1版测试。

有点兴奋过度,问了个蠢问题 。。。
1 楼 blackanger 2008-10-26 01:55
太棒了!
each_with_object 这个方法,是对所有的对象都支持了 ?inject只支持Hash和Array类型。 还没来得及安装rc1版测试。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

Global site tag (gtag.js) - Google Analytics